perm filename MUS5TR.F4[STR,LCS] blob sn#307344 filedate 1978-03-09 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	C***** STANFORD-IRCAM MUSIC FORMAT TO MUSIC-5 FORMAT TRANSLATOR ******
C00012 00003	C**** LOAD THIS VERSION WITH MUS5.F4,MUS5IO.FAI,PLASUB.MAC[MUS,LCS] ******
C00023 00004		SUBROUTINE MSCAN(LL,W)
C00034 00005		SUBROUTINE MPACK(WDCNT, I,NM)
C00037 ENDMK
C⊗;
C***** STANFORD-IRCAM MUSIC FORMAT TO MUSIC-5 FORMAT TRANSLATOR ******
C                 LELAND SMITH, IRCAM, PARIS, JUNE 1977
C
C
C  THESE SUBROUTINES CONVERT STANFORD MUSIC FORMAT TO MUSIC-5 FORMAT, 
C  ALLOWING 'NOT CARDS' TO CONTAIN THE LETTER NAMES OF NOTES, (C,D,E,F,
C  G,A,B; S=SHARP,F=FLAT), PARAMETER NUMBERS DESIGNATED AS P1, P2,
C  P3, ETC., FUNCTION NAMES AS F1, F2, ETC., AND ARITHMATIC EXPRESSIONS.
C
C  ALSO A PARAMETER FIELD MAY CONTAIN THE FUNCTION STATEMENT 'POWER(N1,N2)'
C  WHERE THE RESULT PUT INTO THAT PARAMETER LOCATION IS THE VALUE OF N1 TO
C  THE POWER OF N2.
C
C  ARITHMETIC EXPRESSIONS MAY CONTAIN THE OPERATORS   +   -   *   /  .
C  SPACES BEFORE OR AFTER THESE OPERATORS ARE IGNORED!  HENCE IN ORDER TO
C  PUT A NEGATIVE NUMBER INTO A PARAMETER THE MINUS SIGN MUST BE PRECEDED
C  BY A COMMA.   100  - 440   WILL PRODUCE THE SINGLE VALUE -340, WHEREAS
C  100,  - 440  PRODUCES TWO SEPARATE VALUES.   A PARAMETER MAY BE SETUP BY
C  REFERRING TO OTHER PARAMETERS.   IF P3=440 AND P5=2 THEN THE EXPRESSION
C  P3 * POWER(2,1/24) /P5  WILL PUT THE VALUE 452.89 INTO A PARAMETER FIELD.
C  ALL OPERATIONS ARE DONE IN LEFT-TO-RIGHT ORDER (UNLIKE FORTRAN OR ALGOL
C  WHICH ALWAYS DO DIVIDES AND MULTIPLIES FIRST.)  THUS A STATEMENT AS
C  5+7/2 WILL GIVE THE ANSWER 6.  HOWEVER PARENTHESES MAY BE USED.  5+(7/2)
C  GIVES THE ANSWER 8.5 .   PARENTHESES MAY NOT BE 'NESTED'.
C
C  INSTRUMENT  DEFINITIONS  AND  GEN  FUNCTION  INPUT  ARE  MADE IN THE 
C  TRADITIONAL MUSIC5 FORMAT AS DESCRIBED IN THE BOOK BY MATHEWS, ET AL.
C  HOWEVER THIS PROGRAM AUTOMATICALLY ADDS 2 INTERNALLY TO ALL PARAMETER
C  NUMBERS GIVEN WITHIN INSTRUMENTS.  FROM THE USER'S POINT OF VIEW THIS
C  IS NOT IMPORTANT.  THE HIGHEST PARAMETER NUMBER AVAILABLE IN INSTRUMENT
C  DEFINITIONS IS P33.  THE HIGHEST PARAMETER NUMBER AVAILABLE FOR 'NOT'
C  LINES IS P30, THE LIMIT SET IN THE 'SCORE' PROGRAM.  
C  (SEE SCORE.DOC[DOC,LCS] )
C
C  THE UNIT GENERATORS AVAILABLE ARE 'OUT','OSC','AD2','RAN','ENV','STR',
C  'AD3','AD4','MLT','SET','RAH','END'.   IN ADDITION 'SRT' (OR 'SAM') IS
C  USED TO SET THE SAMPLING RATE. HOWEVER THIS VARIABLE MUST BE SET USING 
C  THE LEFT ARROW, IN THE STANFORD FORMAT.  (E.G.  SRT←12800;)  THIS ALSO 
C  CAN BE SET IN THE NORMAL STANFORD MUSIC FORMAT. (SRATE←25600;)  THE
C  NUMBER OF CHANNELS MUST BE SET IN THE STANFORD MANNER, NCHNS←1; OR
C  NCHNS←2;.  ADDITIONAL UNIT GENERATORS MAY BE USED (IF ADDED TO MUSIC5)
C  BY SETTING UP AN INITIALIZING LIST AS FOLLOWS.
C
C            UNIT GENS;
C            UNIT-NAME(3 LETTERS ONLY)  SPECIAL CODE NUM;
C            . . . . . .
C            END;
C
C     UP TO 20 UNIT GENERATORS MAY BE ADDED.  IF ONE OF THE INNER LINES
C     APPEARED AS FOLLOWS,   GUK 122;   THEN THE NUMBER 122 WILL BE PUT
C     IN THE MUSIC5 P3 FIELD WHENEVER THIS UNIT NAME IS ENCOUNTERED.
C
C  AFTER  INSTRUMENT  DEFINITIONS  ARE  ENTERED  AND  BEFORE THE 'PLAY;' 
C  STATEMENT, EACH INSTRUMENT NAME TO BE USED MUST APPEAR IN THE FOLLOWING
C  KIND OF LIST.
C                   INSTRUMENTS;
C                   NAME1 n1, n2,  FREQ  Pn, Pn . . .  DUR Pn, Pn . . .
C                   NAME2 n1, n2  . . . etc.
C                   etc.  . . . .
C                   END;
C
C  UP TO 27 INSTRUMENTS MAY BE LISTED.  n1 WILL BE THE MUSIC5 INSTRUMENT
C  NUMBER.  SEVERAL NAMES MAY BE ASSOCIATED A SINGLE INSTRUMENT NUMBER.
C  n2 IS THE HIGHEST PARAMETER NUMBER REQUIRED BY THE INSTRUMENT.
C
C  'FREQ' AND 'DUR' ARE USED TO DESIGNATE CERTAIN PARAMETERS FOR CONVERSION
C  TO INCREMENT NUMBERS WHICH WILL BECOME FREQUENCY OR DURATION INPUTS TO
C  OSCILATORS, ETC.  !!NOTE!! THE HIGHEST PARAMETER NUMBER (n2) WILL ALWAYS
C  BE CONVERTED AS THE DURATION OF P2 (THE NOTE DURATION).  
C  I.E. THE PARAMETER USED TO INDICATE THE DURATION OF A STANDARD ENVELOPE
C  WILL ALWAYS BE CONSIDERED TO BE THE LAST REAL PARAMETER OF THE INSTRUMENT.
C  THUS THE USER NEED NOT CONCERN HIMSELF WITH 2 SEPARATE PARAMETERS, ONE 
C  FOR NOTE DURATION AND ONE FOR THE INCREMENT VALUE OF AN ENVELOPE WHICH 
C  LASTS FOR A COMPLETE NOTE DURATION.   THIS LAST PARAMETER WILL ALWAYS BE 
C  SET UP AUTOMATICALLY BASED ON THE VALUE IN P2 AND THE SAMPLING RATE.
C
C  ASIDE FROM THE INSTRUMENT AND GEN DEFINITIONS THIS PROGRAM WILL OPERATE
C  IN AN INTERACTIVE MODE MUCH AS THE STANFORD-IRCAM MUSIC PROGRAM, AS
C  DESCRIBED IN USEMUS.DOC[DOC,LCS].
C
C  THE MAJOR DIFFERENCES ARE AS FOLLOWS:
C        AS EACH 'MUSIC' STATEMENT IS TRANSLATED THE MUSIC-5 FORMAT IS
C        NORMALLY TYPED OUT.  THIS TYPEOUT MAY BE SUPPRESSED BY TYPING
C        THE SYMBOL '&'.  RETYPING THIS SYMBOL WILL CAUSE THE TYPEOUT
C        TO BEGIN AGAIN.
C
C        AFTER YOU ARE IN 'TTY MODE' ( > ) YOU MAY RETURN TO 'INPUT?'
C        BY TYPING THE SYMBOL '!'.
C
C	 IF THE SYMBOL '%' IS TYPED, A BINARY FILE OF ALL MUSIC5 FORMAT
C        INFORMATION WILL BE WRITTEN UNDER THE NAME 'FOR21.DAT'.   THIS
C        FILE SHOULD BE READABLE BY PASS3 OF THE BASIC MUSIC5 PROGRAM.
C
C        THE VARIABLE 'MAG' OF THE STANFORD MUSIC PROGRAM IS COMPUTED
C        AUTOMATICALLY WHEN EVER THE STATEMENTS  SRATE←N;  SRT N; OR
C        SAM N; APPEAR.  THE NUMBER OF CHANNELS IS INITIALIZED AT 1.
C        THIS CAN BE CHANGED WITH NCHNS←N; OR CHA N;.  N CAN ONLY BE
C        A ONE OR A TWO.
C       
C        THE 'PRINT' STATEMENT WILL ONLY RECOGNIZE STANFORD NAMES, SUCH
C        AS 'NCHNS' AND 'SRATE'.   PRINT CHA;  WILL NOT WORK.
C
C        TO SEE THE LIST OF INSTRUMENTS CURRENTLY IN THE PROGRAM GO TO
C        TTY MODE ( > ) AND TYPE <ALT>I <RETURN>.
C
C  THE SOUND FILE COMPUTED WILL ALWAYS HAVE THE NAME 'MUSIC.MSB' AND BE
C  WRITTEN ON DSKM.  THE FILE CONTAINS THE STANDARD HEADER REQUIRED BY
C  'PLAY', 'WAVES', ETC.
C
C  ALL ROUTINES IN THIS PROGRAM ARE IN FORTRAN WITH THE EXCEPTION OF
C  MUS5IO.FAI AND PLASUB.MAC[MUS,LCS].  MUS5IO HAS ROUTINES TO PACK THE
C  SAMPLES THREE TO A WORD AND TO WRITE THEM ON THE DSK.  PLASUB IS
C  SIMPLY THE 'PLAY' PROGRAM SET UP AS A FORTRAN CALLABLE SUBROUTINE.
C
C**** LOAD THIS VERSION WITH MUS5.F4,MUS5IO.FAI,PLASUB.MAC[MUS,LCS] ******
C**** TYPE 'DO DOMUS5.' ***** THIS LOADS AND SAVES AS 'M' WITH DDT. *****
C**** LOAD THIS VERSION WITH MUS5.F4,MUS5IO.FAI,PLASUB.MAC[MUS,LCS] ******
C**** TYPE 'DO DOMUS5.' ***** THIS LOADS AND SAVES AS 'M' WITH DDT. *****

C*** 33 PARAMS SEEMS TO BE LIMIT IN THIS VERSION. (30 IN 'SCORE') *****
	SUBROUTINE MUS5TR(IFIRST,LL,W)
	DIMENSION RX(100),JX(100),W(1)
	COMMON /TR/I(80),IX(50),NN(2),LX(12),KKK(2),INST(27),MX5(40)
	1,INSNUM(27),FQDR(5/32,27),ISCL(21),IPARS(40),IFUN(30)
	1 ,P(30),IWD(11),NPAR(27),JSEM,IPRNT,IPP
	1,SRATE,RNCHN,RMAG,INUM,INS,MM,M,N,JJ,X,Y,IK
	1,ENDX,J  /KNAM/KNAM,IPLAY
	COMMON /SBFILN/SBFILN /AR/IOP /IGEN/IGEN /JP/JPRNT,JWRT
	INTEGER FQDR
	DOUBLE PRECISION NM,IX,KK,II
	EQUIVALENCE (NM,NN),(IBL,LX(1)),(K,KK,KKK),(IZR,RZR)
	1 ,(LESS,LX(9)),(RX,IX,IXJ,JX),(INN,RNN),(RX2,RX(3)),
	1(P2,P(2)),(RX3,RX(5)),(I3,I(3)),(ISEMI,LX(2))
	1,(IBLA,LX(1)),(IAST,LX(3)),(ISRT,IWD(4))
	1,(IAROW,LX(7)),(KPRNT,IWD(6))
	DATA LX/' ',';', '*','/','-','+'
	1,"575004020100,'=','<' ,',' ,'(', ')'/
	1 ,KKK(2)/' '/, IDOT/'.'/, IEX/536870912/,IDEV/1/
	1,ISCL/'CF','C','CS','DF','D','DS','EF','E','ES','FF','F','FS',
	1 'GF','G','GS','AF','A','AS','BF','B','BS'/,MX/0/
	1, IDUR/'DUR'/,FILNM/"556563514300/,JPRNT/-1/,JWRT/1/
	DATA IPARS/'P1','P2','P3','P4','P5','P6','P7','P8','P9',
	1 'P10','P11','P12','P13','P14','P15','P16','P17','P18',
	1 'P19','P20','P21','P22','P23','P24','P25','P26','P27','P28',
	1 'P29','P30',
	1 'P31','P32','P33','P34','P35','P36','P37','P38','P39','P40'/
	DATA RMAG/.0512/,INUM/0/,SRATE/10000./,RNCHN/1./
	DATA IFUN/'F1','F2','F3','F4','F5','F6','F7',
	1 'F8','F9','F10','F11','F12','F13','F14','F15','F16','F17',
	1 'F18','F19','F20','F21','F22','F23','F24','F25','F26','F27' 
	1 ,'F28','F29','F30'/
	1,IWD/'PLAY','FINIS','FINI','SRATE','NCHNS','PRINT',
	1 'CHA','POWER','SRT','SAM','GEN'/,IALT/"765004020100/
C  LX INCLUDES ALL THE DIVIDERS.
401	IF(IFIRST)404,  5,600
404	IGEN=-1
	IPLAY=0
	ENDX=0
	JSEM=0
	INS=-1
402	IDEV=1
	TYPE 1
1 	FORMAT(' INPUT? '$)
100	FORMAT(' >'$)
2	FORMAT(2A5)
	ACCEPT 2,NN
	IF(NN(1).NE.IBLA)GO TO 400
	IDEV=5
	GO TO 5
400	IF(NN(1).EQ.'&')GO TO 603    
C!*** & IS PRNT-NOPRNT FLIPFLOP
	IF(NN(1).EQ.'%')GO TO 604    
C!*** % IS WRT-NOWRT FLIPFLOP
	REREAD 4,I		     
C! %  WRITES BINARY FILE.
	DO 409 K=2,7
409	IF(I(K).EQ.IDOT)GO TO 410
	NN(2)=NN(2)+28  
C!*** ADDS A DOT
410	CALL IFILE(1,NM)
CC410	OPEN(UNIT=1,FILE=NM)
4	FORMAT(80A1)
5	IF(JSEM.AND.J.LT.MM)GO TO 305
	IF(JSEM.NE.99)GO TO 502
	IFIRST=IFIRST+10
	RETURN
600	JSEM=0
	IFIRST=IFIRST-10
	INS=-1
502	IF(IDEV.NE.5)GO TO 601
	IF(IGEN.NE.2)IGEN=-1
	TYPE 100
601	READ(IDEV,4,END=404)I
	IF(I(1).EQ.'!')GO TO 404  
C!**** USE ! TO RETURN TO 'INPUT?'
	IF(I(1).EQ.'%')GO TO 604   
C!*** %=WRITES BINARY FILE FOR21.DAT
	IF(I(1).NE.'&')GO TO 602   
C!*** &=TYPE OUT MUS5 NUMBERS
603	JPRNT=-JPRNT
	GO TO 401
604	JWRT=-JWRT		
C!*** DEFAULT IS NO-WRITE BINARY
	GO TO 401
602	IF(I(1).NE.IALT)GO TO 408
	IF(I(2).NE.'I')GO TO 605   
C!***<ALT>I(NSTRUMENT LIST;)
	DO 606 K=1,INUM
	JK=NPAR(K)-2
606	TYPE 607,INST(K),INSNUM(K),JK
	GO TO 5
607	FORMAT(1XA5,'  NUM=',I2,'  PARAMS=',I2)	
C!*** PRINTS INST INFO.
605	SBFILN=FILNM
	CALL PLAY  
C!**** GO PLAY SOMETHING
	GO TO 5
408	DO 407 K=1,60
407	JX(K)=IBLA
	DO 405 K=1,80
	IF(I(K).EQ.LESS)GO TO 5
405	IF(I(K).NE.IBLA)GO TO 406
	GO TO 5
406	MM=0
  	J=-1	
	IPRNT=0
	JI=0
9	M=0
	N=JI+1
6	JI=JI+1
	K=I(JI)
	DO 7 L=1,12
7	IF(K.EQ.LX(L))GO TO 8
	M=M+1
	GO TO 6		
C!**** NO STRING CAN EXCEED 10 CHARS.
8	IF(K.EQ.LESS)GO TO 15
	IF(M.EQ.0)GO TO 14
	IF(M.GT.10)M=10
	MM=MM+1
	IF(MM.LE.50)GO TO 88
	TYPE 888,(I(JJ),JJ=N,N+9)
	STOP
888	FORMAT(' LINE TOO LONG -- ',10A1)
88	JJ=I(N)
	IF(JJ)GO TO 16  
C!***** JUMP IF 1ST CHAR. IS A LETTER.
	Y=0
	DOT=10.
	DO 18 JK=N,N+M-1
	JA=I(JK)
	IF(JA.NE.IDOT)GO TO 17
	DOT=.1
	GO TO 18
17	X=(JA-'0')/IEX		
C!**** CHANGE ASCII INTO NUMBER
	IF(DOT.LT.1)GO TO 19
	Y=Y*DOT+X
	GO TO 18
19	Y=Y+X*DOT
	DOT=DOT/10.
18	CONTINUE
	RX(MM*2-1)=Y
	RX(MM*2)=9999999.
	GO TO 14
16	CALL MPACK(M,I(N),IX(MM))
	IF(IXJ.NE.'INSTR')GO TO 14
	INS=0
	GO TO 5
14	IF(IXJ.NE.'COMME')GO TO 140
141	READ(1,4)I
	IF(I3.NE.ISEMI)GO TO 141	
C!***** EAT THE DIRECTORY
	GO TO 5
144	MX=MX+1
	MX5(MX)=IXJ	
C!*** PUT IS NEW UNIT GEN. NAME
	MX=MX+1
	MX5(MX)=RX(3)
	GO TO 5
140	IF(IXJ.NE.'UNIT')GO TO 143
	INS=1		
C!*** 'UNIT GENERATOR' IS RESERVED FOR NEW ONES.
	GO TO 5
143	IF(K.EQ.IBL)GO TO 10
	IF(L.EQ.8)K=IAROW	
C!::: CHANGE = INTO ←
	MM=MM+1
	IX(MM)=KK
10	IF(I(JI+1).NE.IBL)GO TO 11
	JI=JI+1
	GO TO 10
11	IF(JI.LT.80)GO TO 9
C NOW WE HAVE ALL ITEMS IN IX ARRAY
15	MM=MM*2
	IF(IXJ.NE.KPRNT)GO TO 142
	INS=-1    
C!***** FOR 'PRINT'
	IPRNT=-1
	
142	J=-1	
	IF(INS.LT.0)GO TO 305
	IF(INS.EQ.2)GO TO 305
26	IF(IXJ.NE.'END')GO TO 127
	MM=0
	INS=-1    
C!***** NOW INITITIALIZATION COMPLETE
	GO TO 5
127	IF(INS.EQ.1)GO TO 144	
C!*** FOR 'UNIT GEN' ADDED
	IF(INUM.EQ.0)GO TO 2127
	DO 1127 K=1,INUM  
C!** FOR POSSIBLE REDEFINITION OF INST.
1127	IF(IXJ.EQ.INST(K))GO TO 3127  
C!*** IS INST ALREADY IN LIST?
2127	INUM=INUM+1
	K=INUM
3127	INST(K)=IXJ	
C!**** GET THE NAME OF AN INST.(5 LTRS ONLY)
	INSNUM(K)=RX2   
C!*** GET ITS NUMBER.
	NPAR(K)=RX3+2   
C!**** GET NUM OF PARAMS, ADD 3 FOR W ARRAY
	K=7	
28	LL=-1
	IF(JX(K).NE.IDUR)GO TO 31
	LL=-LL    
C!*** NOW LOOK AT REST OF THE LINE
31      K=K+2	
	IF(K.GT.MM)GO TO 5    
C!**** CHECK FOR END OF LINE
	IF(RX(K+1).NE.9999999)GO TO 28
	JA=RX(K)+2
	IF(JA.LT.5)GO TO 31     
C!***** IGNORE P1,P2 OF INPUT
	FQDR(JA,INUM)=LL   
C!**** 1=DUR, -1=FREQ, 0=ORDINARY NUM.
	GO TO 31
50	IF(IGEN)308,309,309
309	LL=LL-1
	IF(JSEM.LE.0.AND.IGEN.EQ.1)IGEN=-1   
C!*** FOUND 'END'
	GO TO 59
308	W(1)=1
	IF(LL-1.GE.NPAR(IK))GO TO 56
54	IF(LL.LT.3)LL=3
	DO 55 K=LL,NPAR(IK)-1
55	W(K)=P(K-2)    
C!***** GET INFO ALREADY IN PARAMS
56	DO 57 K=3,LL-1
57	P(K-2)=W(K)	
C!**** FILL UP P LIST AGAIN
	X=W(3)		
C!*** EXCHANGE W(2) AND W(3), ACTION TIME, INST #
	W(3)=W(2)
	W(2)=X
58	LL=NPAR(IK)
	DO 52 K=5,LL-1
	X=FQDR(K,IK)
	IF(X.EQ.0)GO TO 52
	IF(X)GO TO 53
	W(K)=RMAG/W(K)
	GO TO 52
53	W(K)=RMAG*W(K)
52	CONTINUE
	IF(ENDX.LT.W(2)+P2)ENDX=W(2)+P2
	W(LL)=RMAG/W(4)		
C!********* PUT MAG/P2 AT END
59 	IF(JPRNT.GE.0)GO TO 591
	TYPE 590,KNAM
	KNAM=IBLA
	TYPE 51,LL,(W(K),K=1,LL)
591	IF(JWRT)WRITE(21)LL,(W(K),K=1,LL)
500	IFIRST=0
	IF(IGEN.EQ.0)IGEN=-1
	RETURN
590	FORMAT(1XA5,1X$)

306	IF(JPRNT)TYPE 1307,(W(K),K=1,LL-1)
	IF(JPRNT.GT.0)TYPE 307,(W(K),K=1,LL-1)
	IPRNT=0			
C!** RESET NO-PRNT FLAG
	JSEM=0			
C!** RESET SEMICOLON FLAG
	INS=-1
	IF(J.GE.MM-1)GO TO 5	
C!** GO READ ANOTHER LINE
305	CALL MSCAN(LL,W)
303	IF(IPRNT)GO TO 306
	IF(J.LT.MM)JSEM=-1	
C!**** STILL MORE CHARS TO COME.
	IF(ENDX.GE.0)GO TO 302
	ENDX=0
	GO TO 500
302	IF(JSEM)50,5,5  
51	FORMAT(I3,35F10.3)
307	FORMAT(F11.4,$)
1307	FORMAT(F11.4)
	END

	SUBROUTINE MSCAN(LL,W)
	DIMENSION RX(100),JX(100),W(1),IB(20),M5(12),TONES(21)
	COMMON /TR/I(80),IX(50),NN(2),LX(12),KKK(2),INST(27),MX5(40)
	1,INSNUM(27),FQDR(5/32,27),ISCL(21),IPARS(40),IFUN(30)
	1 ,P(30),IWD(11),NPAR(27),JSEM,IPRNT,IPP
	1,SRATE,RNCHN,RMAG,INUM,INS,MM,M,N,JJ,X,Y,IK
	1,ENDX,J  /KNAM/KNAM,IPLAY
	COMMON /SBFILN/SBFILN /AR/IOP /IGEN/IGEN /JP/JPRNT,JWRT
C   OUT, OSC, AD2, RAN, ENV, STR, AD3, AD4, MLT, SET, RAH, GEN
	INTEGER FQDR,RPR
	DOUBLE PRECISION NM,IX,KK,II
	EQUIVALENCE (NM,NN),(IBL,LX(1)),(K,KK,KKK),(IZR,RZR)
	1 ,(LESS,LX(9)),(RX,IX,IX1,JX),(INN,RNN),(RX2,RX(3))
	1 ,(P2,P(2)),(RX3,RX(5)),(I3,I(3)),(ISEMI,
	1 LX(2)),(IBLA,LX(1)),(IAST,LX(3)),(ISRT,IWD(4)),(NCHNS,IWD(5))
	1,(LPR,LX(11)),(RPR,LX(12)),(ICOM,LX(10)),(IPWR,IWD(8))
	1,(LAROW,LX(7)),(JSRT,IWD(9))
	DATA TONES/246.945,261.62,277.18,277.8,293.66,311.13,311.13,
	1 329.63,349.23,329.63,349.23,369.99,369.99,
	1 391.99,415.31,415.31,440.0,466.16,466.16,493.89,523.24/
	DATA IB/'B1','B2','B3','B4','B5','B6','B7','B8','B9',
	1 'B10','B11','B12','B13','B14','B15','B16','B17','B18',
	1 'B19','B20'/
	DATA M5/'OUT','OSC','AD2','RAN','ENV','STR','AD3',
	1'AD4','MLT','SET','RAH','END'/
30	IF(JSEM.NE.0)GO TO 34
	LL=1
	INS=-1
34	J=J+2	
	IPP=0 		
C!FOR 'P3←333;' ETC.
	IPOW=0
	IOP=-1
	IXJ=JX(J)	
	IF(IXJ.NE.ISEMI)GO TO 9
10	IF(IGEN.GT.100)W(3)=IGEN
15	JSEM=-1
	RETURN
9	IF(J.GE.MM)GO TO 1001  
	IF(RX(J+1).EQ.9999999)GO TO 11  
C!*** SKIP IF NUMBER
	IF(IGEN.GT.0)GO TO 450

	DO 32 K=1,11	
C!***** LOOK FOR SPECIAL WORDS
32	IF(IWD(K).EQ.IXJ)
	1 GO TO (3,13,13,304,303,302,303,4,505,505,422)K
	IF(IXJ.NE.'INS')GO TO 402
	KNAM=IXJ
	W(1)=2
	IGEN=2
	GO TO 424
505	JK=4	   
C !**** FOR SRATE OR SRT
	IF(K.NE.4)JK=2	
	JK=J+JK
	GO TO 304

450	DO 400 K=1,12
400	IF(IXJ.EQ.M5(K))GO TO(425,425,425,425,425,425,425,425
	1,425,425,425,411),K
	DO 451 JK=1,40,2   
C!*** FOR USER-ADDED UNIT GENS. (UP TO 20)
	IF(MX5(JK).NE.IXJ)GO TO 451
	W(3)=MX5(JK+1)
	GO TO 426
451	CONTINUE
503	TYPE 504,IXJ
	JSEM=0
	J=MM
	RETURN   
504	FORMAT(' UNKNOWN SYMBOL ',A5)
411 	LL=3
	KNAM=IXJ
	IGEN=1   
C!*** =1 IS FLAG TO CHANGE IT TO -1
	J=MM
	INS=-1
	GO TO 10  
422	W(1)=3   
C!***** GEN
	KNAM=IXJ
	IGEN=0
424	INS=-1
	LL=2
	GO TO 36
425	W(3)=K+100
426	KNAM=IXJ
436	LL=4  
	GO TO 36

3	J=J+2	
C   !**** FOUND 'PLAY;'
	IF(JX(J).NE.ISEMI)CALL ERR(1)
	IPLAY=-1
	SBFILN='TEST'
	CALL PUTFIL(SBFILN)
	CALL FASTOU(I,128)
C THE HEADER (SUCH AS IT IS)  USETO IN MAIN PROG.
	JSEM=-1
	IF(J.LT.MM)GO TO 34
	JSEM=0
	RETURN
4	JL=LL
	JOP=IOP
	J=J+2
	IF(JX(J).NE.LPR)CALL ERR(2)
	IPOW=-1
	IOP=-1
	GO TO 36  
C!**FIND NUM UP TO THE COMMA
7	IF(IPOW.GT.0)GO TO 8
	IPOW=1
	GO TO 36
8	LL=LL-2
 	W(LL)=W(LL)**W(LL+1)
	IPOW=0
	IOP=JOP	 
C!** GET BACK FLAGS
	GO TO 38
	
302	LL=1
	IPRNT=-1    
C!***** FOR 'PRINT' FEATURE
	GO TO 36
304	SRATE=RX(J+4)
	J=J+6
	RMAG=512./SRATE
	W(3)=4
	W(4)=SRATE
351	W(1)=11
	W(2)=0
	IGEN=0
	LL=5
	GO TO 15
303	IF(IXJ.EQ.'CHA')J=J-2
	RNCHN=RX(J+4)    
C!**** FOR NCHNS←N;
	J=J+6
CC	IF(RX(JK+1).NE.9999999)JK=JK+2  
C!*** SKIP A COMMA
CC	IF(JX(JK+2).EQ.ISEMI)GO TO 352  
C!*** FOR NCHNS←n;
352	W(3)=8		
C!*** FOR NCHNS
	W(4)=RNCHN-1
	GO TO 351
35	IF(IPLAY.GE.0)CALL ERR(4)
	W(2)=INSNUM(IK)	
C!**** W IS P ARRAY IN MUSIC5
	LL=3	
C!**** W(2) AND W(3) WILL BE EXCHANGED LATER
	KNAM=IXJ
36	J=J+2	
	IF(J.GT.MM)GO TO 1001  	
C!******  50 = DONE
CC	JK=J*2
	IXJ=JX(J)	
	IF(IXJ.NE.ISEMI)GO TO 1
	JSEM=-1
1000	IF(IPP.EQ.0)GO TO 10
	P(IPP)=W(1)
	LL=1
	IPP=0
	IF(J.LT.MM)GO TO 30  
	INS=-1   
C!*** I HOPE THIS IS THE RIGHT PLACE FOR THIS.
1001	IF(IGEN.EQ.0.OR.JSEM.EQ.0)JSEM=1
	IF(JSEM)JSEM=0
	RETURN

1	IF(RX(J+1).NE.9999999)GO TO 2
11	IF(IOP)GO TO 40
	IF(IOP.NE.5)GO TO 12
	RX(J)=-RX(J)  
C!*** IOP=5 MEANS MINUS WITH COMMA IN FRONT
	W(LL)=RX(J)
	LL=LL+1
	GO TO 14
12	CALL ARITH(RX(J),W,LL)
14	IOP=-1    
C!*** RESET OPERATOR FLAG
	GO TO 36   
C!*** USE PARENTH'S FOR COMPOSITE EXPRESSIONS!!!!

40	W(LL)=RX(J)
38	LL=LL+1
	IF(IOP)GO TO 36
	LL=LL-1
380	CALL ARITH(W(LL),W,LL)
	GO TO 14

402	IF(JSEM.GT.0)GO TO 2	
C!**** READING CONTINUATION LINE.
	DO 33 IK=1,INUM
33	IF(IXJ.EQ.INST(IK))GO TO 35
	INS=2	
C! NEXT IS SOMETHING OUTSIDE OF INST. AND PARAMS.

2	IF(IGEN.GT.0)GO TO 427
	DO 306 K=1,21
	IF(IXJ.NE.ISCL(K))GO TO 306
	W(LL)=TONES(K)
CC	JK=K
CC	CALL NOTES(JK,W(LL))
	GO TO 38
306	CONTINUE  
C!***** FINDS NOTE IN SCALE

427	DO 307 K=1,40        
C!****** FIND A PARAM NUM.
	IF(IXJ.NE.IPARS(K))GO TO 307
	IF(INS.LE.0)GO TO 340
	JK=J+2	
	IF(JX(JK).NE.LAROW)GO TO 340
	IPP=K
	LL=1
	J=JK	
	GO TO 36
340	W(LL)=P(K)	
C!***** FOUND Pn
	IF(IPRNT)GO TO 38
	IF(IGEN.GT.0)W(LL)=K+2.  
C!*** PARAM NUMS ARE 2 LESS THAN IN BOOK.
	GO TO 38    
C!**** P4 IS CHANGED TO 6
307	CONTINUE

	DO 344 K=1,30
	IF(IXJ.NE.IFUN(K))GO TO 344
	JL=K
	IF(IGEN.GT.0)JL=-JL-100	
C!*** FOR Fn IN INST DEFINITION
	W(LL)=JL
	GO TO 38
344	CONTINUE

	IF(IGEN.LE.0)GO TO 341
	DO 342 K=1,20
	IF(IXJ.NE.IB(K))GO TO 342
	W(LL)=-K
	GO TO 38
342	CONTINUE

341	DO 39 K=3,6
	IF(LX(K).NE.IXJ)GO TO 39
	IOP=K-2
	JK=JX(J-2)
	IF(JK.EQ.ICOM)IOP=5 
C!** COMMA DISABLES NEXT OPERATOR
	IF(JK.EQ.LAROW)IOP=5 
C!**  ← DISABLES NEXT OPERATOR
	IF(JK.EQ.LPR)IOP=5 
C!** LFT PARENTH. DISABLES NEXT OPERATOR
	GO TO 36
39	CONTINUE
308	IF(IXJ.EQ.LAROW)GO TO 36   
C!*** PASS LEFT ARROW
	IF(IXJ.EQ.IPWR)GO TO 4
	IF(IXJ.EQ.RPR)GO TO 500
	IF(IXJ.EQ.LPR)GO TO 500
	IF(IXJ.NE.JSRT.AND.IXJ.NE.ISRT)GO TO 510
	W(LL)=SRATE
335	LL=LL+1
	GO TO 36
510	IF(IXJ.NE.NCHNS)GO TO 511
	W(LL)=RNCHN
	GO TO 335
511	IF(IXJ.NE.ICOM)GO TO 503 	
C!***** UNKNOWN CHAR.
500	IF(IPOW.NE.0)GO TO 7
	IF(IXJ.NE.LPR)GO TO 501
	JPOW=IPOW
	IPOW=0
	KOP=IOP
	IOP=-1
	JL=LL	
C!**** SAVE VARIOUS POINTERS WHEN INSIDE PARENTHS.
	GO TO 36
501	IF(IXJ.NE.RPR)GO TO 502
	IPOW=JPOW	
C!*** GET BACK STUFF
	IOP=KOP
CC	LL=JL+1	!**?????
	IF(IOP)GO TO 36
	LL=JL
	GO TO 380	
C!GO DO ARITHMETIC
502	IF(IPRNT)GO TO 36     
C!**** FOUND COMMA IN PRINT STATEMENT.
5	IF(JX(J-2).NE.ICOM)GO TO 132
133	W(LL)=P(LL-2)   
C!** ONLY CARES ABOUT 2 COMMAS IN A ROW
	GO TO 335
132	IF(INS.GE.0)GO TO 36
	IF(LL.EQ.3)GO TO 133	
C!*** =3 MEANS COMMA FOR P1.
	GO TO 36

13	LL=2
	IPLAY=0		
C!*** TURN OFF PLAY FLAG
	W(1)=6
	W(2)=ENDX+.5   
C!***** ENDX IS P1+P2 OF THE LONGEST LASTING INST.
	IF(JPRNT)TYPE 51,LL,W(1),W(2)
	IF(JWRT.GE.0)GO TO 130
	WRITE(21)LL,W(1),W(2)
	END FILE 21
	TYPE 131
130	J=MM
	JSEM=99    
C!*** WON'T READ LINE BEYOND 'FINISH;'  ***************
	ENDX=-1
51	FORMAT(I3,35F10.3)
131	FORMAT(' *****  FOR21.DAT WAS WRITTEN  *****')
	END

	SUBROUTINE MPACK(WDCNT, I,NM)
	EQUIVALENCE (NMM,NX)
	DIMENSION I(1),M(10),NX(2)
	DOUBLE PRECISION NM,NMM
	INTEGER WDCNT
	DATA KK/128/,LL/"377777777777/,JJ/"2000000000/
	DATA MM/"774000000000/

	DO 1 K=1,10
	M(K)=I(K)
1	IF(K.GT.WDCNT)M(K)=' '
	JX=0
	DO 2 J=1,2
	NN=0
	DO 10 K=5,1,-1
	NN=NN .OR. (M(K+JX) .AND. MM)
	IF (K-1) 20,20,17
17	IF (NN.GE.0)GO TO 13
	NN = (( NN .AND. LL)/KK) .OR. JJ
	GO TO 10
13	NN = NN / KK
10	CONTINUE
20	JX=5
2 	NX(J)=NN
	NM=NMM
	END
 
	SUBROUTINE ERR(N)
	GO TO (1,2,3,4),N
1	TYPE 101
	STOP
101	FORMAT(' MISSING SEMICOLON')
2	TYPE 102
	STOP
102	FORMAT(' MISSING PARENTHESIS')
3	TYPE 103
	STOP
103	FORMAT(' MISSING COMMA')
4	TYPE 104
104	FORMAT(' MISSING PLAY;')
	STOP
	END

	SUBROUTINE ARITH(Y,W,LL)
	DIMENSION W(1)
	COMMON /AR/IOP
47	X=W(LL-1)
	GO TO (41,42,43,44),IOP
41	X=X*Y
	GO TO 45
42	X=X/Y
	GO TO 45
43	X=X-Y
	GO TO 45
44	X=X+Y
45	W(LL-1)=X
	END